﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace Zhy.MvvmBaseObject
{
    /// <summary>
    /// 子页面-用于颜色消息订阅的实例类
    /// </summary>
    public partial class SubWindow : Window
    {
        public SubWindow()
        {
            InitializeComponent();
            // 注册消息事件
            // 1、消息无过滤
            Messenger.Defualt.GetEvent<EventMessageAction>()
                .Subscribe(ReceiveAction);

            //2、符合条件的消息接收
             //Subscribe(Action < TPayload > action, Predicate < TPayload > filter)
            Messenger.Defualt.GetEvent<EventMessageDataModel>()
                .Subscribe(Receive1, obj => obj.Id == 1); // 消息过滤符合条件的消息才会被接受

            // 3、消息委托的引用方式
            // Subscribe(Action<TPayload> action, bool keepSubscriberReferenceAlive)
            // keepSubscriberReferenceAlive:False
            // false     true->对象销毁的时候，做注销操作
            Messenger.Defualt.GetEvent<EventMessageArgs>()
                .Subscribe(Receive2, true); // 正常情况下这里为false（会自动释放资源） ，如果为true的情况当页面关闭时会出发OnClosed方法，用于释放资源，如果没有释放资源，资源会一直存在



            // 4、多线程状态控制
            // Subscribe(Action<TPayload> action, ThreadOption threadOption)
            // 关于ThreadOption选项：
            // PublisherThread:（默认选项） 发布者在什么线程发布的   这个注册的逻辑就在哪个线程执行
            // UIThread： 不管发布者在哪个线程发布，这里注册的逻辑总在UI线程执行
            //          如果在执行逻辑里有页面对象的操作，可以选择这个选项
            // BackgroundThread： 不管发布者在哪个线程发布，这里注册的逻辑总在后台线程执行
            //          如果有个数据与主线程无关，但是需要执行，这里一般使用后台线程处理
            // PublisherThread&UIThread  消息逻辑执行完成后，返回发布方
            // BackgroundThread  新建一个线程，把消息逻辑包起来，跟发布方无关  
                         // 如果写日志可以使用后台现场写，不占用UI线程
            Messenger.Defualt.GetEvent<EventMessageArgs>()
                .Subscribe(Receive, Prism.Events.ThreadOption.BackgroundThread);

            // 以上的4中消息方式有组合在一起的重载函数
        }


        /// <summary>
        /// 如果对象为true时的销毁对象用
        /// </summary>
        /// <param name="e"></param>
        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);

            Messenger.Defualt.GetEvent<EventMessageArgs>().Unsubscribe(Receive2);
        }

        private void Receive1(DataModel obj)
        {

        }

        /// <summary>
        /// 注册的消息事件执行方法
        /// </summary>
        /// <param name="obj"></param>
        private void Receive(object obj)
        {
            //......要执行的很多业务逻辑

            // 接受后续操作的委托
            var ea = obj as EventAction;
            // 执行后续操作的委托
            ea.ResultAction.Invoke(true);
        }

        /// <summary>
        /// 注册的消息事件执行方法
        /// </summary>
        /// <param name="obj"></param>
        private void ReceiveAction(EventAction obj)
        {
            //......要执行的很多业务逻辑

            // 接受后续操作的委托
            var ea = obj;
            // 执行后续操作的委托
            ea.ResultAction.Invoke(true);
        }

        /// <summary>
        /// 注册的消息事件执行方法
        /// </summary>
        /// <param name="obj"></param>
        private void Receive2(object obj)
        {

        }
    }
}
